#ifndef __ADC_DRIVER_H
#define __ADC_DRIVER_H

#include "sys_pub.h"

// -------------------------- 核心宏定义 --------------------------
#define ADC_RESOLUTION_12BIT    1024    // 12位ADC满量程值（0~4095）
#define ADC_REF_VOLTAGE_MV      5000U    // 参考电压（3.3V，单位：mV，需按硬件调整）
#define ADC_CONVERT_TIMEOUT_MS  5U     // 默认转换超时时间（100ms，防止死等）

// -------------------------- 枚举定义 --------------------------
/**
 * @brief ADC采样通道（对应STM8S ADC2引脚，按需裁剪）
 */
typedef enum {
    ADC_CHANNEL_0 = ADC2_CHANNEL_0,    // PC0
    ADC_CHANNEL_1 = ADC2_CHANNEL_1,    // PC1
    ADC_CHANNEL_2 = ADC2_CHANNEL_2,    // PC2
    ADC_CHANNEL_3 = ADC2_CHANNEL_3,    // PC3
    ADC_CHANNEL_4 = ADC2_CHANNEL_4,    // PC4
    ADC_CHANNEL_5 = ADC2_CHANNEL_5,    // PC5
    ADC_CHANNEL_6 = ADC2_CHANNEL_6,    // PD2
    ADC_CHANNEL_7 = ADC2_CHANNEL_7,    // PD3
    ADC_CHANNEL_MAX                    // 通道总数（用于边界检查）
} AdcChannel;

/**
 * @brief ADC读取结果状态
 */
typedef enum {
    ADC_READ_OK = 0,          // 读取成功（结果有效）
    ADC_READ_ERR_INVALID,     // 错误：通道无效/未初始化
    ADC_READ_ERR_TIMEOUT      // 错误：转换超时
} AdcReadStatus;

// -------------------------- 对外接口声明 --------------------------
/**
 * @brief 初始化指定ADC通道（外设仅初始化1次，多通道共享）
 * @param channel: 目标采样通道（AdcChannel枚举值）
 * @retval bool: 初始化结果（true=成功，false=失败）
 */
bool adc_init();

/**
 * @brief 读取指定ADC通道的采样结果（阻塞式，内部完成“触发-等待-转换”）
 * @param channel: 目标采样通道（需先通过adc_init初始化）
 * @param adc_raw: 指针，用于存储ADC原始值（0~4095，NULL表示不存储）
 * @param voltage_mv: 指针，用于存储转换后的电压值（单位：mV，NULL表示不存储）
 * @retval AdcReadStatus: 读取状态（ADC_READ_OK/错误码）
 */
AdcReadStatus adc_read(AdcChannel channel, uint16_t *adc_raw, uint16_t *voltage_mv);

#endif // __ADC_DRIVER_H